'''
TODO 基本概念
1、说明：数据库是专门用来存储数据的软件
2、注意：对于测试工作而言，如果项目页面没有实现，但是又想校验数据，可以直接通过查询数据库实现
3、关系：具体存在的商品录入后 - 产生对应的数据（存到数据库中） - 最后会被加载到项目页面中
4、分类：
     ① 关系型数据库：以数据表为核心
          11、RDMS - Relational Database Management System
          12、常见的关系型数据库：
               Oracle：在大型项目中使用（银行、电信）
               MySQL：web项目中最广泛使用的
               Microsoft SQL Server：在微软的项目中使用
               SQLite：轻量级数据库，主要应用于移动平台
          13、核心要素：
                行：一条记录
                列：字段
                表：行的集合
                库：表的集合，可有n个数据表
     ② 非关系型数据库
5、数据库语言的类型：
    ① DQL (Data Query Language)：数据查询语言          - 测试人员必须掌握查询语句（select）
    ② DML (Data Manipulation Language)：数据操作语言
    ③ DCL (Data Control Language)：数据控制语言
    ④ DDL (Data Definition Language)：数据定义语言
6、连接数据库的操作步骤：
     注意：将来工作中，想要远程连接数据库，需要具备：
          ① 数据库所在服务器的IP地址及数据库的端口号
          ② 向相关人员获取数据库的账号和密码
          ③ 使用数据库连接工具，进行远程连接数据库
          ④ 注意网络连通性（本地终端：ifconfig - 获取IP地址     远程终端：ping ip地址）
7、数据类型和约束：
      ① 类型：
           整数：int
           小数：decimal(5,2)，共5位数，小数占2位，整数占3位
           字符串：varchar
           日期时间：datetime，2024-7-27 20：16
      ② 约束：
           主键：primary key，唯一
                习惯用id，用于保证数据表内的数据每一条的顺序是固定的，不会因为增删而导致乱序
                一般设置为自动递增、无符号
           非空：not null，不允许空值
           唯一：unique，不允许重复
           默认值：default
           外键：foreign key，引用另一张表的主键
8、常见SQL语句：
    ① 数据库
        重点：在测试工作中，为防止对数据库产生错误操作，或产生垃圾数据，需提前做备份
             垃圾数据：如，在自动化测试中，对注册模块操作生成的所有数据，为典型垃圾数据，应清理
             备份：指备份数据库，选中数据库test - 右键 - 转储SQL文件 - 结构+数据 - 取名（test.sql）、找合适位置 - 存储
                                          - 最后一行：Finished successfully 表示备份成功 - 关闭
             验证备份有效：
                   测试产生数据： navicat中，打开原表 - 随意修改数据并保存（测试中产生的数据） - 关闭
                   还原数据库：  navicat中，选中数据库test - 右键 - 运行SQL文件 - 选中备份数据库（test.sql） - 开始
                                                      - 最后一行：Finished successfully 表示还原成功 - 关闭
             使用命令进行备份：
                   命令不需要连接到数据库，也即非mysql>模式（连接操作，cmd终端：mysql -uroot -p 输入密码：xsc921101  或 mysql -uroot -pxsc921101  退出exit;）
                   备份，cmd终端：mysqldump -uroot -p test > python.sql   输密码
                   还原，cmd终端：mysql -uroot -p test < python.sql   输密码


          11 创建数据库：
                 create database if not exists python charset=utf8 collate=utf8_general_ci;
          12 查看创建结果：
                 show create database python;
          13 使用数据库：
                 use python;
                 select database();  -忘记数据库时，可以查看数据库
          14 修改数据库：
                 alter database python
                 default charset utf8
                 default collate utf8_general_ci;
          15 删除数据库：
                 drop database python;
          16 查看所有数据库：
                 show databases;
    ② 表：
        所有表名的规范：项目简称 + 表的内容 + 附加内容
        如：tp_goods_attr（tpshop商城_商品_属性）
          17 创建表：
                 create table stu(
                 id int unsigned primary key auto_increment,
                 age int,
                 name varchar(25)
                 );
          18 查看创建结果：
                 show create table stu;
          19 查看表结构：
                 desc stu;
          20 添加数据
                 insert into stu ("张三", 22), ("李四",23);
          21 修改数据
                 update stu set age=21 where name="张三";
          22 删除数据的方法：
                - 删掉表（数据和表结构均删除） - 删除表：
                      drop table if exists stu;
                - 删除所有数据，保留表结构，并重置主键字段的计数 - 截断表：
                      truncate table stu;
                - 删除所有数据，不重置主键字段的计数 - 清空表：
                       delete from stu where name="张三";
          23 逻辑删除（假删）
                 注意：对于重要数据，用delete删除，无法恢复，可用逻辑删除
                      添加字段 isdelete，默认0（未删除），1（已删除）
                 修改为删除状态：
                     update stu set isdelete=1 where name="张三";
                 查询未删除数据：
                     select * from stu where isdelete=0;
          24、查询语句：
                01 起别名（别名的引号、as可省略）：
                        select name as '姓名' from stu;
                        = select name 姓名 from stu;
                02 去重：
                        select distinct (a),b,c from stu;   - 只对a去重
                        select distinct  a,b,c  from stu;     -a、b、c都去重
                03 not - 只对右侧的条件有效
                   and、or - 左右两边起作用
                   查询条件的字符串必须加""
                     不是一班的学生：
                        select * from stu where not class="一班" and age=20;
                        = select * from stu where age=20 and not class="一班";
                04 like：
                      select * from stu where name like "%张_";
                05 范围查询：
                     between and：必须从小到大
                      select * from stu where name in ("张三", "李四");
                      select * from stu where age between 25 and 36;
                06 is null：
                      select * from stu where age is null;
                      select * from stu where age is not null;
                07 count:
                      一般用*，用某字段，可能因空值出错
                      select count(*) from stu;
                08 where 和 having:
                      having 后可跟聚合函数，where不行
                      having 对 group by 后的结果进行筛选，where 对 from 的原始数据进行筛选
                09 limit 开始行，共几行：
                     默认从0开始，如果从第一条开始，0可省略
                         前5行：    select * from stu limit 0,5;
                                   = select * from stu limit 5;
                         第5-10行： select * from stu limit 4,6;
                         每页m条，第n页： limit (n-1)*m, m
                         每页4条，第2页： select * from stu limit 4,4;
                         每页4条，第4页： select * from stu limit 12,4;
                         查询年龄最大的学生信息： select * from stu order by age desc limit 1;
          24、连接查询：
                实际工作中，最多三张表连接查询
                连接查询的结果中，表与表之间的字段名不能重复，否则报错
                - 解决：将重复字段使用别名加以区分，其中一张表直接显示（go.*）
                01 内连接：提取共同部分
                      select * from stu s
                      inner join class c on s.id=c.id;
                    或：
                      select * from stu s,class c where s.id=c.id;
                02 左连接：提取左表全部信息，右表对应内容显示，不对应为NUll
                      select * from stu s
                      left join class c on s.id=c.id;
                03 右连接：提取右表全部信息
                      select * from stu s
                      right join class c on s.id=c.id;
                04 自关联：一张表
                          至少有两个字段之间有关联
                          起别名
                   显示省市-两表联查：
                      select * from areas a1
                      inner join areas a2 on a1.aid=a2.pid
                      where a1.atitle="河南省";
                   显示省市区-三表联查：
                      select * from areas a1
                      left join areas a2 on a1.aid=a2.pid
                      left join areas a3 on a2.aid=a3.pid
                      where a1.atitle="河南省";
                05 子查询：辅助主查询，需要用括号括起来，运用优先级括号最高
                   充当条件
                      select * from stu where age > (select avg(age) from stu;
                   充当数据源
                      select * from (select go.*, ca.id cid, ca.typId ctid, ca.cname from goods go
                                     left join category ca on go.typeId=ca.typeId) new where new.company="拼夕夕";
                     或-左连接：
                      select * from goods go
                      left join category ca on go.typeId=ca.typeID
                      where go.company="拼夕夕";
          25 外键：
              通过外部数据表的字段，来控制当前数据表的数据内容变更，以避免单方面数据移除，导致关联表产生垃圾数据
              大量增加外键设置，会严重影响除查询外（增、删、改）的其他操作效率
              实际工作中少用，面试容易被问到
                01 添加外键：
                     create table class(
                     cid int primary key,
                     age int);

                     create table stu(
                     id int,
                     name varchar(20),
                     constraint stu_fk foreign key(id) references class(cid)
                     );
                02 删除外键：
                     alter table stu drop foreign key stu_fk;
          26 索引：
               可以大幅度提高查询语句的执行效率
               大量增加索引设置，会严重影响除查询外（增、删、改）的其他操作效率
                01 添加索引：
                     create index name_index on stu(name);
                     alter table stu add index name_index(name);
                02 检验索引执行效率：
                     set profiling=1;  (开启时间检测）
                     select * from stu where num='10000';
                     alter table stu add index(num);
                     select * from stu where num='10000';
                     show profiling;(查看执行时间）
                03 删除索引：
                     drop index name_index on stu;
                     alter table stu drop index name_index;
9、E-R模型：
    基本元素：E-entry：实体，描述具有相同特征事物的抽象 - 矩形
            属性：实体具有的各种特征 - 椭圆
            R-relationship：实体之间的各种关系（一对一、一对多、多对多） -菱形
    操作：选中一张表 - 上方（查看） - ER图表
         数据库开发者（DBA）设计数据库时使用
'''